home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / madwifi / net80211 / ieee80211_linux.h < prev    next >
C/C++ Source or Header  |  2006-05-11  |  18KB  |  508 lines

  1. /*-
  2.  * Copyright (c) 2003-2005 Sam Leffler, Errno Consulting
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. The name of the author may not be used to endorse or promote products
  14.  *    derived from this software without specific prior written permission.
  15.  *
  16.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  17.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  18.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  19.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  20.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  21.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  22.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  23.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  25.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26.  *
  27.  * $Id: ieee80211_linux.h 1522 2006-04-22 05:26:56Z proski $
  28.  */
  29. #ifndef _NET80211_IEEE80211_LINUX_H_
  30. #define _NET80211_IEEE80211_LINUX_H_
  31.  
  32. #ifdef CONFIG_NET_WIRELESS
  33. #include <linux/wireless.h>
  34. #endif
  35.  
  36. /*
  37.  * Task deferral
  38.  *
  39.  * Deduce if tasklets are available.  If not then
  40.  * fall back to using the immediate work queue.
  41.  */
  42. #include <linux/interrupt.h>
  43. #ifdef DECLARE_TASKLET            /* native tasklets */
  44. #define IEEE80211_TQ_STRUCT tasklet_struct
  45. #define IEEE80211_INIT_TQUEUE(a,b,c)    tasklet_init((a),(b),(unsigned long)(c))
  46. #define IEEE80211_SCHEDULE_TQUEUE(a)    tasklet_schedule((a))
  47. #define IEEE80211_CANCEL_TQUEUE(a)    if (!in_interrupt()) tasklet_kill((a))
  48. typedef unsigned long IEEE80211_TQUEUE_ARG;
  49. #define mark_bh(a)
  50. #else                    /* immediate work queue */
  51. #define IEEE80211_TQ_STRUCT tq_struct
  52. #define IEEE80211_INIT_TQUEUE(a,b,c)        INIT_TQUEUE(a,b,c)
  53. #define IEEE80211_SCHEDULE_TQUEUE(a) do { \
  54.     int __macro_needmark;        \
  55.     __macro_needmark |= queue_task((a), &tq_immediate);    \
  56.     if (__macro_needmark)        \
  57.         mark_bh(IMMEDIATE_BH);    \
  58. } while(0)
  59. typedef void *IEEE80211_TQUEUE_ARG;
  60. #define    tasklet_disable(t)    do { (void) t; local_bh_disable(); } while (0)
  61. #define    tasklet_enable(t)    do { (void) t; local_bh_enable(); } while (0)
  62. /* XXX: not supporting cancel in old kernels! */
  63. #define IEEE80211_CANCEL_TQUEUE(a)    ((a),0)
  64. #endif /* !DECLARE_TASKLET */
  65.  
  66. #define    IEEE80211_RESCHEDULE    schedule
  67.  
  68. /*
  69.  * Beacon handler locking definitions.
  70.  * Beacon locking 
  71.  * UAPSD locking 
  72.  */
  73. typedef spinlock_t ieee80211com_lock_t;
  74. #define    IEEE80211_LOCK_INIT(_ic, _name)                \
  75.     spin_lock_init(&(_ic)->ic_comlock)
  76. #define    IEEE80211_LOCK_DESTROY(_ic)
  77. #define    IEEE80211_LOCK_IRQ(_ic) do {                \
  78.     unsigned long __ilockflags;                \
  79.     spin_lock_irqsave(&(_ic)->ic_comlock, __ilockflags);
  80. #define    IEEE80211_UNLOCK_IRQ(_ic)                    \
  81.     spin_unlock_irqrestore(&(_ic)->ic_comlock, __ilockflags);    \
  82. } while (0)
  83. #define    IEEE80211_UNLOCK_IRQ_EARLY(_ic)                    \
  84.     spin_unlock_irqrestore(&(_ic)->ic_comlock, __ilockflags);
  85. #define IEEE80211_LOCK_BH(_ic)    spin_lock_bh(&(_ic)->ic_comlock)
  86. #define IEEE80211_UNLOCK_BH(_ic) spin_unlock_bh(&(_ic)->ic_comlock)
  87. #define IEEE80211_LOCK(_ic)    spin_lock(&(_ic)->ic_comlock)
  88. #define IEEE80211_UNLOCK(_ic)    spin_unlock(&(_ic)->ic_comlock)
  89.  
  90. /* NB: beware, spin_is_locked() is unusable for !SMP */
  91. #if defined(CONFIG_SMP)
  92. #define    IEEE80211_LOCK_ASSERT(_ic) \
  93.     KASSERT(spin_is_locked(&(_ic)->ic_comlock),("ieee80211com not locked!"))
  94. #else
  95. #define    IEEE80211_LOCK_ASSERT(_ic)
  96. #endif
  97.  
  98. #define IEEE80211_VAPS_LOCK_INIT(_ic, _name)        \
  99.     spin_lock_init(&(_ic)->ic_vapslock)
  100. #define IEEE80211_VAPS_LOCK_DESTROY(_ic)
  101. #define IEEE80211_VAPS_LOCK(_ic)    spin_lock(&(_ic)->ic_vapslock);
  102. #define IEEE80211_VAPS_UNLOCK(_ic)    spin_unlock(&(_ic)->ic_vapslock);
  103. #define IEEE80211_VAPS_LOCK_BH(_ic)    spin_lock_bh(&(_ic)->ic_vapslock);
  104. #define IEEE80211_VAPS_UNLOCK_BH(_ic)    spin_unlock_bh(&(_ic)->ic_vapslock);
  105. #define IEEE80211_VAPS_LOCK_IRQ(_ic)    do {    \
  106.     int _vaps_lockflags;            \
  107.     spin_lock_irqsave(&(_ic)->ic_vapslock, _vaps_lockflags);
  108. #define IEEE80211_VAPS_UNLOCK_IRQ(_ic)    \
  109.     spin_unlock_irqrestore(&(_ic)->ic_vapslock, _vaps_lockflags); \
  110. } while (0)
  111. #define IEEE80211_VAPS_UNLOCK_IRQ_EARLY(_ic)    spin_unlock_irqrestore(&(_ic)->ic_vapslock, _vaps_lockflags)
  112.  
  113.  
  114. /* NB: beware, spin_is_locked() is unusable for !SMP */
  115. #if defined(CONFIG_SMP)
  116. #define IEEE80211_VAPS_LOCK_ASSERT(_ic) \
  117.     KASSERT(spin_is_locked(&(_ic)->ic_vapslock),("ieee80211com_vaps not locked!"))
  118. #else
  119. #define IEEE80211_VAPS_LOCK_ASSERT(_ic)
  120. #endif
  121.  
  122.  
  123. /*
  124.  * Node locking definitions.
  125.  */
  126. typedef spinlock_t ieee80211_node_lock_t;
  127. #define    IEEE80211_NODE_LOCK_INIT(_nt, _name)    spin_lock_init(&(_nt)->nt_nodelock)
  128. #define    IEEE80211_NODE_LOCK_DESTROY(_nt)
  129. #define    IEEE80211_NODE_LOCK(_nt)    spin_lock(&(_nt)->nt_nodelock)
  130. #define    IEEE80211_NODE_UNLOCK(_nt)    spin_unlock(&(_nt)->nt_nodelock)
  131. #define    IEEE80211_NODE_LOCK_BH(_nt)    spin_lock_bh(&(_nt)->nt_nodelock)
  132. #define    IEEE80211_NODE_UNLOCK_BH(_nt)    spin_unlock_bh(&(_nt)->nt_nodelock)
  133. #define    IEEE80211_NODE_LOCK_IRQ(_nt)    do {    \
  134.     unsigned long __node_lockflags;        \
  135.     spin_lock_irqsave(&(_nt)->nt_nodelock, __node_lockflags);
  136. #define    IEEE80211_NODE_UNLOCK_IRQ(_nt)        \
  137.     spin_unlock_irqrestore(&(_nt)->nt_nodelock, __node_lockflags); \
  138. } while(0)
  139. #define    IEEE80211_NODE_UNLOCK_IRQ_EARLY(_nt)        \
  140.     spin_unlock_irqrestore(&(_nt)->nt_nodelock, __node_lockflags);
  141.  
  142. /* NB: beware, *_is_locked() are bogusly defined for UP+!PREEMPT */
  143. #if (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT)) && defined(spinlock_is_locked)
  144. #define    IEEE80211_NODE_LOCK_ASSERT(_nt) \
  145.     KASSERT(spinlock_is_locked(&(_nt)->nt_nodelock), \
  146.         ("802.11 node table not locked!"))
  147. #else
  148. #define    IEEE80211_NODE_LOCK_ASSERT(_nt)
  149. #endif
  150.  
  151. /*
  152.  * Node table scangen locking definitions.
  153.  */
  154. typedef spinlock_t ieee80211_scan_lock_t;
  155. #define    IEEE80211_SCAN_LOCK_INIT(_nt, _name) spin_lock_init(&(_nt)->nt_scanlock)
  156. #define    IEEE80211_SCAN_LOCK_DESTROY(_nt)
  157. #define    IEEE80211_SCAN_LOCK_BH(_nt)    spin_lock_bh(&(_nt)->nt_scanlock)
  158. #define    IEEE80211_SCAN_UNLOCK_BH(_nt)    spin_unlock_bh(&(_nt)->nt_scanlock)
  159. #define    IEEE80211_SCAN_LOCK_IRQ(_nt)    do {    \
  160.     unsigned long __scan_lockflags;        \
  161.     spin_lock_irqsave(&(_nt)->nt_scanlock, __scan_lockflags);
  162. #define    IEEE80211_SCAN_UNLOCK_IRQ(_nt)        \
  163.     spin_unlock_irqrestore(&(_nt)->nt_scanlock, __scan_lockflags); \
  164. } while (0)
  165. #define    IEEE80211_SCAN_UNLOCK_IRQ_EARLY(_nt)        \
  166.     spin_unlock_irqrestore(&(_nt)->nt_scanlock, __scan_lockflags);
  167.  
  168. /* NB: beware, spin_is_locked() is unusable for !SMP */
  169. #if defined(CONFIG_SMP)
  170. #define    IEEE80211_SCAN_LOCK_ASSERT(_nt) \
  171.     KASSERT(spin_is_locked(&(_nt)->nt_scanlock), ("scangen not locked!"))
  172. #else
  173. #define    IEEE80211_SCAN_LOCK_ASSERT(_nt)
  174. #endif
  175.  
  176. /*
  177.  * 802.1x MAC ACL database locking definitions.
  178.  */
  179. typedef spinlock_t acl_lock_t;
  180. #define    ACL_LOCK_INIT(_as, _name)    spin_lock_init(&(_as)->as_lock)
  181. #define    ACL_LOCK_DESTROY(_as)
  182. #define    ACL_LOCK(_as)            spin_lock(&(_as)->as_lock)
  183. #define    ACL_UNLOCK(_as)            spin_unlock(&(_as)->as_lock)
  184. #define    ACL_LOCK_BH(_as)        spin_lock_bh(&(_as)->as_lock)
  185. #define    ACL_UNLOCK_BH(_as)        spin_unlock_bh(&(_as)->as_lock)
  186.  
  187. /* NB: beware, spin_is_locked() is unusable for !SMP */
  188. #if defined(CONFIG_SMP)
  189. #define    ACL_LOCK_ASSERT(_as) \
  190.     KASSERT(spin_is_locked(&(_as)->as_lock), ("ACL not locked!"))
  191. #else
  192. #define    ACL_LOCK_ASSERT(_as)
  193. #endif
  194.  
  195. /* __skb_append got a third parameter in 2.6.14 */
  196. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14)
  197. #define __skb_append(a,b,c)    __skb_append(a,b)
  198. #endif
  199.  
  200. /*
  201.  * Per-node power-save queue definitions.  Beware of control
  202.  * flow with IEEE80211_NODE_SAVEQ_LOCK/IEEE80211_NODE_SAVEQ_UNLOCK.
  203.  */
  204. #define    IEEE80211_NODE_SAVEQ_INIT(_ni, _name) do {        \
  205.     skb_queue_head_init(&(_ni)->ni_savedq);            \
  206. } while (0)
  207. #define    IEEE80211_NODE_SAVEQ_DESTROY(_ni)
  208. #define    IEEE80211_NODE_SAVEQ_QLEN(_ni)    skb_queue_len(&(_ni)->ni_savedq)
  209. #define    IEEE80211_NODE_SAVEQ_LOCK(_ni)                 \
  210.     spin_lock(&(_ni)->ni_savedq.lock)
  211. #define    IEEE80211_NODE_SAVEQ_UNLOCK(_ni)            \
  212.     spin_unlock(&(_ni)->ni_savedq.lock)
  213. #define    IEEE80211_NODE_SAVEQ_LOCK_IRQ(_ni) do {            \
  214.     unsigned long __sqlockflags;                \
  215.     spin_lock_irqsave(&(_ni)->ni_savedq.lock, __sqlockflags);
  216. #define    IEEE80211_NODE_SAVEQ_UNLOCK_IRQ(_ni)            \
  217.     spin_unlock_irqrestore(&(_ni)->ni_savedq.lock, __sqlockflags);\
  218. } while (0)
  219.  
  220. /* caller MUST lock IEEE80211_NODE_SAVEQ */
  221. #define    IEEE80211_NODE_SAVEQ_DEQUEUE(_ni, _skb, _qlen) do {    \
  222.     _skb = __skb_dequeue(&(_ni)->ni_savedq);        \
  223.     (_qlen) = skb_queue_len(&(_ni)->ni_savedq);        \
  224. } while (0)
  225. #define    _IEEE80211_NODE_SAVEQ_ENQUEUE(_ni, _skb, _qlen, _age) do {\
  226.     struct sk_buff *tail = skb_peek_tail(&(_ni)->ni_savedq);\
  227.     if (tail != NULL) {                    \
  228.         _age -= M_AGE_GET(tail);            \
  229.         __skb_append(tail, _skb, &(_ni)->ni_savedq);    \
  230.     } else {                         \
  231.         __skb_queue_head(&(_ni)->ni_savedq, _skb);    \
  232.     }                            \
  233.     M_AGE_SET(_skb, _age);                    \
  234.     (_qlen) = skb_queue_len(&(_ni)->ni_savedq);         \
  235. } while (0)
  236.  
  237. /*
  238.  * Transmitted frames have the following information
  239.  * held in the sk_buff control buffer.  This is used to
  240.  * communicate various inter-procedural state that needs
  241.  * to be associated with the frame for the duration of
  242.  * it's existence.
  243.  *
  244.  * NB: sizeof(cb) == 48 and the vlan code grabs the first
  245.  *     8 bytes so we reserve/avoid it.
  246.  */
  247. struct ieee80211_cb {
  248.     u_int8_t vlan[8];            /* reserve for vlan tag info */
  249.     struct ieee80211_node *ni;
  250.     u_int32_t flags;
  251. #define    M_LINK0        0x01            /* frame needs WEP encryption */
  252. #define    M_FF        0x02            /* fast frame */
  253. #define    M_PWR_SAV    0x04            /* bypass power save handling */
  254. #define M_UAPSD        0x08            /* frame flagged for u-apsd handling */
  255. #define M_RAW           0x10
  256.     struct sk_buff *next;            /* fast frame sk_buf chain */
  257. };
  258.  
  259.  
  260. #define M_FLAG_SET(_skb, _flag) \
  261.     (((struct ieee80211_cb *)(_skb)->cb)->flags |= (_flag))
  262. #define    M_FLAG_CLR(_skb, _flag) \
  263.     (((struct ieee80211_cb *)(_skb)->cb)->flags &= ~(_flag))
  264. #define    M_FLAG_GET(_skb, _flag) \
  265.     (((struct ieee80211_cb *)(_skb)->cb)->flags & (_flag))
  266. #define M_FLAG_KEEP_ONLY(_skb, _flag) \
  267.     (((struct ieee80211_cb *)(_skb)->cb)->flags &= (_flag))
  268.  
  269. #define    M_PWR_SAV_SET(skb) M_FLAG_SET((skb), M_PWR_SAV)
  270. #define    M_PWR_SAV_CLR(skb) M_FLAG_CLR((skb), M_PWR_SAV)
  271. #define    M_PWR_SAV_GET(skb) M_FLAG_GET((skb), M_PWR_SAV)
  272.  
  273. /*
  274.  * Skbufs on the power save queue are tagged with an age and
  275.  * timed out.  We reuse the hardware checksum field in the
  276.  * mbuf packet header to store this data.
  277.  * XXX use private cb area
  278.  */
  279. #define    M_AGE_SET(skb,v)    (skb->csum = v)
  280. #define    M_AGE_GET(skb)        (skb->csum)
  281. #define    M_AGE_SUB(skb,adj)    (skb->csum -= adj)
  282.  
  283. struct ieee80211com;
  284. struct ieee80211vap;
  285.  
  286. int ieee80211_load_module(const char *);
  287.  
  288. /*
  289.  * Node reference counting definitions.
  290.  *
  291.  * ieee80211_node_initref    initialize the reference count to 1
  292.  * ieee80211_node_incref    add a reference
  293.  * ieee80211_node_decref    remove a reference
  294.  * ieee80211_node_dectestref    remove a reference and return 1 if this
  295.  *                is the last reference, otherwise 0
  296.  * ieee80211_node_refcnt    reference count for printing (only)
  297.  */
  298. #define ieee80211_node_initref(_ni)    atomic_set(&(_ni)->ni_refcnt, 1)
  299. #define ieee80211_node_incref(_ni)    atomic_inc(&(_ni)->ni_refcnt)
  300. #define    ieee80211_node_decref(_ni)    atomic_dec(&(_ni)->ni_refcnt)
  301. #define    ieee80211_node_dectestref(_ni)    atomic_dec_and_test(&(_ni)->ni_refcnt)
  302. #define    ieee80211_node_refcnt(_ni)    (_ni)->ni_refcnt.counter
  303.  
  304. #define    le16toh(_x)    le16_to_cpu(_x)
  305. #define    htole16(_x)    cpu_to_le16(_x)
  306. #define    le32toh(_x)    le32_to_cpu(_x)
  307. #define    htole32(_x)    cpu_to_le32(_x)
  308. #define    be32toh(_x)    be32_to_cpu(_x)
  309. #define    htobe32(_x)    cpu_to_be32(_x)
  310.  
  311. /*
  312.  * Linux has no equivalents to malloc types so null these out.
  313.  */
  314. #define    MALLOC_DEFINE(type, shortdesc, longdesc)
  315. #define    MALLOC_DECLARE(type)
  316.  
  317. /*
  318.  * flags to malloc.
  319.  */
  320. #define    M_NOWAIT    0x0001        /* do not block */
  321. #define    M_WAITOK    0x0002        /* ok to block */
  322. #define    M_ZERO        0x0100        /* bzero the allocation */
  323.  
  324. static __inline void *
  325. ieee80211_malloc(size_t size, int flags)
  326. {
  327.     void *p = kmalloc(size, flags & M_NOWAIT ? GFP_ATOMIC : GFP_KERNEL);
  328.     if (p && (flags & M_ZERO))
  329.         memset(p, 0, size);
  330.     return p;
  331. }
  332. #define    MALLOC(_ptr, cast, _size, _type, _flags) \
  333.     ((_ptr) = (cast)ieee80211_malloc(_size, _flags))
  334. #define    FREE(addr, type)    kfree((addr))
  335.  
  336. /*
  337.  * This unlikely to be popular but it dramatically reduces diffs.
  338.  */
  339. #define printf(...) printk(__VA_ARGS__)
  340. struct ieee80211com;
  341. extern void if_printf(struct net_device *, const char *, ...);
  342. extern const char *ether_sprintf(const u_int8_t *);
  343.  
  344. /*
  345.  * Queue write-arounds and support routines.
  346.  */
  347. extern    struct sk_buff *ieee80211_getmgtframe(u_int8_t **frm, u_int pktlen);
  348. #define    IF_ENQUEUE(_q,_skb)    skb_queue_tail(_q,_skb)
  349. #define    IF_DEQUEUE(_q,_skb)    (_skb = skb_dequeue(_q))
  350. #define    _IF_QLEN(_q)        skb_queue_len(_q)
  351. #define    IF_DRAIN(_q)        skb_queue_drain(_q)
  352. extern    void skb_queue_drain(struct sk_buff_head *q);
  353.  
  354. #ifndef __MOD_INC_USE_COUNT
  355. #define    _MOD_INC_USE(_m, _err)                        \
  356.     if (!try_module_get(_m)) {                    \
  357.         printk(KERN_WARNING "%s: try_module_get failed\n",    \
  358.             __func__); \
  359.         _err;                            \
  360.     }
  361. #define    _MOD_DEC_USE(_m)        module_put(_m)
  362. #else
  363. #define    _MOD_INC_USE(_m, _err)    MOD_INC_USE_COUNT
  364. #define    _MOD_DEC_USE(_m)    MOD_DEC_USE_COUNT
  365. #endif
  366.  
  367. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
  368. static __inline u_int64_t
  369. get_jiffies_64(void)
  370. {
  371.     return (u_int64_t) jiffies;        /* XXX not right */
  372. }
  373. #endif
  374.  
  375. /* msecs_to_jiffies appeared in 2.6.7 and 2.4.29 */
  376. #include <linux/delay.h>
  377. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \
  378.       LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) || \
  379.      LINUX_VERSION_CODE < KERNEL_VERSION(2,4,29)
  380.  
  381. /* The following definitions and inline functions are
  382.  * copied from the kernel src, include/linux/jiffies.h */
  383.  
  384. #ifndef MSEC_PER_SEC
  385. #define MSEC_PER_SEC (1000L)
  386. #endif
  387.  
  388. #ifndef MAX_JIFFY_OFFSET
  389. #define MAX_JIFFY_OFFSET ((~0UL >> 1)-1)
  390. #endif
  391.  
  392. static __inline unsigned int jiffies_to_msecs(const unsigned long j)
  393. {
  394. #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
  395.     return (MSEC_PER_SEC / HZ) * j;
  396. #elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
  397.     return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
  398. #else
  399.     return (j * MSEC_PER_SEC) / HZ;
  400. #endif
  401. }
  402.  
  403. static __inline unsigned long msecs_to_jiffies(const unsigned int m)
  404. {
  405.     if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
  406.         return MAX_JIFFY_OFFSET;
  407. #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
  408.     return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
  409. #elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
  410.     return m * (HZ / MSEC_PER_SEC);
  411. #else
  412.     return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC;
  413. #endif
  414. }
  415.  
  416. #endif
  417.  
  418. #ifndef CLONE_KERNEL
  419. /*
  420.  * List of flags we want to share for kernel threads,
  421.  * if only because they are not used by them anyway.
  422.  */
  423. #define CLONE_KERNEL    (CLONE_FS | CLONE_FILES | CLONE_SIGHAND)
  424. #endif
  425.  
  426. #ifndef offset_in_page
  427. #define    offset_in_page(p) ((unsigned long) (p) & ~PAGE_MASK)
  428. #endif
  429.  
  430. #ifndef module_put_and_exit
  431. #define module_put_and_exit(code) do {    \
  432.     _MOD_DEC_USE(THIS_MODULE);    \
  433.     do_exit(code);            \
  434. } while (0)
  435. #endif
  436.  
  437. /*
  438.  * Linux uses __BIG_ENDIAN and __LITTLE_ENDIAN while BSD uses _foo
  439.  * and an explicit _BYTE_ORDER.  Sorry, BSD got there first--define
  440.  * things in the BSD way...
  441.  */
  442. #undef _LITTLE_ENDIAN
  443. #define    _LITTLE_ENDIAN    1234    /* LSB first: i386, vax */
  444. #undef _BIG_ENDIAN
  445. #define    _BIG_ENDIAN    4321    /* MSB first: 68000, ibm, net */
  446. #include <asm/byteorder.h>
  447. #if defined(__LITTLE_ENDIAN)
  448. #define    _BYTE_ORDER    _LITTLE_ENDIAN
  449. #elif defined(__BIG_ENDIAN)
  450. #define    _BYTE_ORDER    _BIG_ENDIAN
  451. #else
  452. #error "Please fix asm/byteorder.h"
  453. #endif
  454.  
  455. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)
  456. #define __user
  457. #define __kernel
  458. #define __iomem
  459. #endif
  460.  
  461.  
  462. #ifdef CONFIG_SYSCTL
  463. /*
  464.  * Deal with the sysctl handler api changing.
  465.  */
  466. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8)
  467. #define    IEEE80211_SYSCTL_DECL(f, ctl, write, filp, buffer, lenp, ppos) \
  468.     f(ctl_table *ctl, int write, struct file *filp, \
  469.       void __user *buffer, size_t *lenp)
  470. #define    IEEE80211_SYSCTL_PROC_DOINTVEC(ctl, write, filp, buffer, lenp, ppos) \
  471.     proc_dointvec(ctl, write, filp, buffer, lenp)
  472. #else
  473. #define    IEEE80211_SYSCTL_DECL(f, ctl, write, filp, buffer, lenp, ppos) \
  474.     f(ctl_table *ctl, int write, struct file *filp, \
  475.       void __user *buffer, size_t *lenp, loff_t *ppos)
  476. #define    IEEE80211_SYSCTL_PROC_DOINTVEC(ctl, write, filp, buffer, lenp, ppos) \
  477.     proc_dointvec(ctl, write, filp, buffer, lenp, ppos)
  478. #endif
  479.  
  480. void ieee80211_sysctl_vattach(struct ieee80211vap *);
  481. void ieee80211_sysctl_vdetach(struct ieee80211vap *);
  482. #endif /* CONFIG_SYSCTL */
  483.  
  484. #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
  485. #define IEEE80211_VLAN_TAG_USED 1
  486.  
  487. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20)
  488. #define    vlan_hwaccel_receive_skb(skb, grp, tag)    vlan_hwaccel_rx(skb, grp, tag)
  489. #endif
  490. #else
  491. #define IEEE80211_VLAN_TAG_USED 0
  492. #endif
  493. void ieee80211_vlan_vattach(struct ieee80211vap *);
  494. void ieee80211_vlan_vdetach(struct ieee80211vap *);
  495.  
  496. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
  497. #define    free_netdev(dev)    kfree(dev)
  498. #endif
  499.  
  500. void ieee80211_ioctl_vattach(struct ieee80211vap *);
  501. void ieee80211_ioctl_vdetach(struct ieee80211vap *);
  502. struct ifreq;
  503. int ieee80211_ioctl_create_vap(struct ieee80211com *, struct ifreq *,
  504.     struct net_device *);
  505. int ieee80211_create_vap(struct ieee80211com *, char *, struct net_device *,
  506.     int, int);
  507. #endif /* _NET80211_IEEE80211_LINUX_H_ */
  508.